//这里写token验证中间件
const jwt=require('jsonwebtoken')
const fs=require("fs")
const path=require('path')
//私钥签证，公钥解密
const cert=fs.readFileSync(path.join(__dirname,'../config/key/public.key'))//这里直接传入绝对路径
//定义需要过滤的路径
const verifyUrl=['/user']
//token验证中间件
const tokenCert=async (req, res, next) => {
    const url=req.url
    if(!verifyUrl.includes(url)){//如果没有在需要验证的路径中，就执行下一个中间件
        next()
        return
    }
    const {authorization}=ctx.request.header
    const token=authorization.replace("Bearer","")
    try{
        jwt.verify(token,cert,(err,decoded)=>{
            if(err){
                throw new Error(err)//如果出现错误，就抛出异常
            }else{
                ctx.state.user=decoded.user//设置全局变量
                next()//如果token验证通过，就继续执行后面的中间件
            }
        })
    }catch(err){
        //TokenExpiredError: jwt expired
        //JsonWebTokenError: jwt malformed
        if(err.message=="TokenExpiredError: jwt expired"){
            ctx.status=500
            ctx.body={
                message:"token已过期,请重新登录"
            }
        }
        if(err.message=="JsonWebTokenError: jwt malformed"){
            ctx.status=500
            ctx.body={
                message:"无效的token,请重新登录"
            }
        }
    }
}


module.exports=tokenCert